Integração R e Python

um caso de amor (e ódio)

Rafael Lira

Tech Stack

Estrutura da apresentação

  • Motivação

  • Introdução à linguagem python

  • Integração R/python

  • Equivalências do da disciplina no python

  • ML com scikit-learn no R

R ou Python?

Uma briga (quase) superada …

Uma briga (quase) superada …

Qual vocês acham que é o R?

Uma briga (quase) superada …

Fonte: DataCamp

Hadley Wichman

Cientista chefe na RStudio (futura Posit)

Não é uma batalha […] use o que te faz feliz!” , 2019

Diferenças, vantagens, desvantagens….

R

  • Usuários: Acadêmicos, estatísticos, biólogos, economistas …

  • Modelos em poucas linhas, possibilidade de escrever de várias formas.

  • Estatística e visualização (ggplot2!)

  • CRAN, GitHub: + pacotes, + fáceis de instalar e mais documentados.

Python

  • Usuários: Cient. computação, Eng. software …

  • Sensível a indentação.

  • ETL/ML workflows e ambientes de produção escaláveis

  • Pacotes/dependências mais “chatinhos”

E porque integrar R/python afinal?

Argumento 1: Uma pode ser melhor que a outra para um determinado problema.

Python melhor:

  • 2012: todos os requisitos.

R veio depois com:

  • Resumindo: O foco é resolver o problema. Leia o post.

E porque integrar R/python afinal?

  • Argumento 1: Uma pode ser melhor que a outra para um determinado problema.

    R melhor:

    RStudio recentemente:

    Shiny for Python

E porque integrar R/python afinal?

Argumento 2: A sua equipe pode ter pessoas de diferentes linguagens.

(ou uma mistura dos dois!)

Exemplos

1) A preparação dessa apresentação

2) Esta apresentação no rstudio::conf(2022)

Diversidade de pensamento

Mais chances de encontrar a melhor solução para um problema de forma mais eficiente. Leia

Basicamente …

Python no R

Reticulate:

O pacote da trégua

Scripts do Python no R

  • Execução de scripts do Python interagindo com a sessão do R;
  • Tradução entre objetos do R e do Python (como entre data frames do R e do Pandas);

Reticulate

Lista de comandos

ls("package:reticulate")
 [1] "%as%"                               "array_reshape"                     
 [3] "as_iterator"                        "conda_binary"                      
 [5] "conda_create"                       "conda_install"                     
 [7] "conda_list"                         "conda_python"                      
 [9] "conda_remove"                       "conda_version"                     
[11] "configure_environment"              "dict"                              
[13] "eng_python"                         "import"                            
[15] "import_builtins"                    "import_from_path"                  
[17] "import_main"                        "install_miniconda"                 
[19] "install_python"                     "iter_next"                         
[21] "iterate"                            "miniconda_path"                    
[23] "miniconda_update"                   "np_array"                          
[25] "py"                                 "py_available"                      
[27] "py_call"                            "py_capture_output"                 
[29] "py_clear_last_error"                "py_config"                         
[31] "py_config_error_message"            "py_del_attr"                       
[33] "py_del_item"                        "py_dict"                           
[35] "py_discover_config"                 "py_ellipsis"                       
[37] "py_eval"                            "py_exe"                            
[39] "py_func"                            "py_function_docs"                  
[41] "py_function_wrapper"                "py_get_attr"                       
[43] "py_get_item"                        "py_has_attr"                       
[45] "py_help"                            "py_help_handler"                   
[47] "py_id"                              "py_install"                        
[49] "py_is_null_xptr"                    "py_iterator"                       
[51] "py_last_error"                      "py_len"                            
[53] "py_list_attributes"                 "py_load_object"                    
[55] "py_main_thread_func"                "py_module_available"               
[57] "py_none"                            "py_numpy_available"                
[59] "py_run_file"                        "py_run_string"                     
[61] "py_save_object"                     "py_set_attr"                       
[63] "py_set_item"                        "py_set_seed"                       
[65] "py_str"                             "py_suppress_warnings"              
[67] "py_to_r"                            "py_to_r_wrapper"                   
[69] "py_unicode"                         "py_validate_xptr"                  
[71] "py_version"                         "py_versions_windows"               
[73] "PyClass"                            "r_to_py"                           
[75] "register_class_filter"              "register_help_topics"              
[77] "register_module_help_handler"       "register_suppress_warnings_handler"
[79] "repl_python"                        "source_python"                     
[81] "tuple"                              "use_condaenv"                      
[83] "use_miniconda"                      "use_python"                        
[85] "use_python_version"                 "use_virtualenv"                    
[87] "virtualenv_create"                  "virtualenv_exists"                 
[89] "virtualenv_install"                 "virtualenv_list"                   
[91] "virtualenv_python"                  "virtualenv_remove"                 
[93] "virtualenv_root"                   

Reticulate:

use_virtualenv("./venv", required = TRUE)
# py_install("pandas")
# py_install("numpy")
pd <- import("pandas", as = "pd", convert = FALSE)

repl_python(
  input = "import numpy as np
  array = np.array([[1,2],[3,4],[5.0,6]])
  print(array)
  print(type(array))"
)
>>>  import numpy as np
>>>    array = np.array([[1,2],[3,4],[5.0,6]])
>>>    print(array)
>>>    print(type(array))
array <- py$array
class(array)
[1] "matrix" "array" 
repl_python(
  input = "
  dictionary = {'alpha': 1, 'beta': 2, 'lista': list(range(5))}
  print(dictionary)
  print(type(dictionary))"
)
>>>  
>>>    dictionary = {'alpha': 1, 'beta': 2, 'lista': list(range(5))}
>>>    print(dictionary)
>>>    print(type(dictionary))
# Convertendo dicionário do Python para lista do R
(dictionary <- py$dictionary)
$alpha
[1] 1

$beta
[1] 2

$lista
[1] 0 1 2 3 4
class(dictionary)
[1] "list"

Rpy2:

Códigos do R no Python

Rcpp:

C++ no R

  • C++: Linguagem de médio/alto nível e com alta performance
  • Veloz
  • Eficiente

Pitfalls

Falta de suporte oficial para R

Suporte oficial do Heroku

Conversando com APIs

Falta de escalabilidade

  • Quando o gasto de tempo não vale a pena (curva de aprendizado)

Limitações do sistema

  • Falta de espaço em disco

  • Falta de RAM

  • Falta de Suporte